iT邦幫忙

2024 iThome 鐵人賽

DAY 17
0
佛心分享-SideProject30

從卡關到通關的Spring Boot 腦內風暴系列 第 17

null就用容器保存起來?—Optional 說明

  • 分享至 

  • xImage
  •  

Java開發常需要處理null值,通常會使用一堆if條件檢查是否為空,這是為了避免NullPointerException問題,寫起來很繁瑣,然而這個問題在Java 8開始就有大幅改善,因為Java 8引入Optional,能夠更好解決null值問題。但使用上也並非毫無缺點,使用時仍需多加考慮。

什麼是Optional

Option可以保存任何值,甚至是null值,最大的作用就是減少直接使用null檢查的情形,避免引發直接處理null值帶來的風險。但也有人認為引入Optional只是換一種方式處理null,並非真正解決null值問題,甚至還可能花費更多心力處理Optional的例外情形。

Optional使用方式

以下舉例,查詢資料庫某個task資料時,有可能會不存在,通常會返回結果或null值,但如果是使用Optional,就能清楚處理這種不確定的情形:

public Optional<Task> findTaskById(int id) {
    // 返回找到的task,或返回空Optional
    return Option.ofNullable(taskRepository.findById(id));
}

以上設計能直接避免返回null,不用每次都額外處理null檢查,但可讀性在某些狀況下可能不如傳統的if else好。

Optional常用方法

Optional也有提供相關方法處理返回結果。

  • 檢查是否有值 isPresent()
// isPresent() 有值會返回true,否則返回false。
Optional<Task> task = findTaskById(1);
if (task.isPresent()) {
    System.out.println("Task found: " + task.get());
} else {
    System.out.println("No task found.");
}
  • 有值則執行某些動作 ifPresent()
// ifPresent() 有值才執行指定的邏輯。
findTaskById(1).ifPresent(task -> System.out.println("Task found: " + task.getName()));
  • 無值返回預設值 orElse()
// orElse() 沒有值時,返回一個預設值。
Task task = findTaskById(1).orElse(new Task("Default Task"));
System.out.println("Task: " + task.getName());

Optional潛在問題

必須了解Optipnal並非完全用於取代null,通常會建議用於方法的返回值,若是用於其他像是方法參數、類變數等,反而可能讓程式碼變得更加冗長。
另外要注意的是,Optional是封裝容器,在使用Optional時,程式會對此進行解封、檢查,反而會影響性能。

綜合上述,透過Optional可以減少冗長且繁瑣的null檢查,且能夠更有效率的處理空值狀況,降低NullPointerException風險,但某些情況下,直接使用if else等傳統方法處理N,反而能更高效也更好讀。在使用Optional時要多加思考適用性唷!


上一篇
統一管理重點解耦—AOP 面向切面編程
下一篇
建構函數作用 vs 建構無參函數的必要
系列文
從卡關到通關的Spring Boot 腦內風暴30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言